package cz.stv.kucera_tomas_sen.auto;
import cz.stv.pecinovsky.správceplátna.*;
import cz.stv.pecinovsky.utility.*;

/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy. */


import org.junit.After;
import org.junit.Before;
import org.junit.Test;


import static org.junit.Assert.*;



/*******************************************************************************
 * Testovací třída {@code Auto4Test} slouží ke komplexnímu otestování
 * třídy {@link Auto4Test}.
 *
 * @author    jméno autora
 * @version   0.00.000
 */
public class Auto4Test
{
    private SprávcePlátna SP;
    private Auto4 auto1;
    private Auto4 auto2;
    private Přesouvač presouvac1;
    private Okruh okruh1;
    private Okruh okruh2;
    private Řidič ridic1;
    private Řidič ridic2;
    private Kreslítko kreslitko;

    //== KONSTANTNÍ ATRIBUTY TŘÍDY =============================================
    //== PROMĚNNÉ ATRIBUTY TŘÍDY ===============================================
    //== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ====================
    //== KONSTANTNÍ ATRIBUTY INSTANCÍ ==========================================
    //== PROMĚNNÉ ATRIBUTY INSTANCÍ ============================================
    //== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ====================================
    //== OSTATNÍ NESOUKROMÉ METODY TŘÍDY =======================================

    //##########################################################################
    //== KONSTRUKTORY A TOVÁRNÍ METODY =========================================
    //-- Testovací třída vystačí s prázdným implicitním konstruktorem ----------
    //== PŘÍPRAVA A ÚKLID PŘÍPRAVKU ============================================

    /***************************************************************************
     * Inicializace předcházející spuštění každého testu a připravující tzv.
     * přípravek (fixture), což je sada objektů, s nimiž budou testy pracovat.
     */
    @Before
    public void setUp()
    {
        SP = SprávcePlátna.getInstance();
        SP.setRozměr( 25, 15);
        SP.odstraňVše();
        presouvac1 = new Přesouvač(5);
        
        //ridic1.jeď();
        //ridic2.jeď();

    }


    /***************************************************************************
     * Úklid po testu - tato metoda se spustí po vykonání každého testu.
     */
    @After
    public void tearDown()
    {
    }



    //== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =================================
    //== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ====================================
    //== SOUKROMÉ A POMOCNÉ METODY TŘÍDY =======================================
    //== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ====================================
    //== INTERNÍ DATOVÉ TYPY ===================================================
    //== VLASTNÍ TESTY =========================================================
    //
    //     /********************************************************************
    //      *
    //      */
    //     @Test
    //     public void testXxx()
    //     {
    //     }

    @Test
    public void testVlevo()
    {
        auto1.vlevoVbok();
    }

    @Test
    public void testVpravo()
    {
        auto1.vpravoVbok();
    }

    @Test
    public void testVlevo2()
    {
        auto1.vpred();
        IO.čekej( 1000);
        auto1.vlevoVbok();
        IO.čekej( 1000);
        auto1.vpred();
        IO.čekej( 1000);
        auto1.vlevoVbok();
        IO.čekej( 1000);
        auto1.vpred();
        IO.čekej( 1000);
        auto1.vlevoVbok();
        IO.čekej( 1000);
        auto1.vpred();
    }

        @Test
    public void testVpravo2()
    {
        auto1.vpred();
        IO.čekej( 1000);
        auto1.vpravoVbok();
        IO.čekej( 1000);
        auto1.vpred();
        IO.čekej( 1000);
        auto1.vpravoVbok();
        IO.čekej( 1000);
        auto1.vpred();
        IO.čekej( 1000);
        auto1.vpravoVbok();
        IO.čekej( 1000);
        auto1.vpred();
    }

    @Test
    public void testVlevo4x()
    {
        auto1.vlevoVbok();
        IO.čekej( 1000);
        auto1.vlevoVbok();
        IO.čekej( 1000);
        auto1.vlevoVbok();
        IO.čekej( 1000);
        auto1.vlevoVbok();
    }

        @Test
    public void testVpravo4x()
    {
        auto1.vpravoVbok();
        IO.čekej( 1000);
        auto1.vpravoVbok();
        IO.čekej( 1000);
        auto1.vpravoVbok();
        IO.čekej( 1000);
        auto1.vpravoVbok();
    }

    @Test
    public void testVpred1()
    {
        presouvac1.přesunNa(150, 30, auto1);
        auto1.vpravoVbok();
        presouvac1.přesunNa(150, 150, auto1);
                auto1.vpravoVbok();
        presouvac1.přesunNa( 20, 150, auto1);
                auto1.vpravoVbok();
        presouvac1.přesunNa( 20, 30, auto1);
    }

    @Test
    public void pokus()
    {
        auto1.vpred();
        IO.čekej( 500);
        auto1.vpravoVbok();
        IO.čekej( 500);
        auto1.vpred();
        IO.čekej( 500);
        auto1.vpravoVbok();
        IO.čekej( 500);
        auto1.vpred();
        IO.čekej( 500);
        auto1.vpravoVbok();
        IO.čekej( 500);
        auto1.vpred();
        IO.čekej( 500);
        auto1.vlevoVbok();
    }
    
        @Test
    public void testOkruh()
    {
        okruh1 = new Okruh( new PoleCesty( new Pozice( 0, 100), 100, Barva.SVĚTLEŠEDÁ, Směr8.JIH));
        auto1 = new Auto4( 0, 100);
        okruh2 = new Okruh( new PoleCesty( new Pozice( 650, 100), 100, Barva.SVĚTLEŠEDÁ, Směr8.JIH));

        auto2 = new Auto4( 650, 100);
        SP.přidej(auto1);
        SP.přidej(auto2);
        ridic1 = new Řidič( okruh1, auto1);
        ridic2 = new Řidič( okruh2, auto2);
        Řadič ovladac2 = new Řadič( auto2);
        int[] klavesy = { 65, 68, 87, 83, 90, 99, 67};
        Řadič ovladac1 = new Řadič( auto1, klavesy, true);
        //Řadič ovladac2 = Řadič.vytvořPro( auto1);
        Rozhodčí rozhodčí1 = new Rozhodčí( okruh1, auto1);
        Rozhodčí rozhodčí2 = new Rozhodčí( okruh2, auto2);
        IO.zpráva( "ok");
    }
        
    @Test
    public void testPosuvný()
    {
        auto1 = new Auto4( 0, 100);
        auto1.nakresli( kreslitko);
        IO.čekej( 1000);
        auto1.vpred();
        IO.čekej( 1000);

    }
        
}






